package ucla.axelia.controlador.servicios;

import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;

import org.hibernate.criterion.Criterion;
import org.hibernate.criterion.Order;
import org.hibernate.criterion.Restrictions;

import com.obelisco.modelo.data.DataGenerica;

import ucla.axelia.controlador.interfaces.IServicioAdministracionReporteVoluntariosPorPerfil;
import ucla.axelia.modelo.beans.EstadoCivil;
import ucla.axelia.modelo.beans.GrupoSanguineo;
import ucla.axelia.modelo.beans.RespuestaCerrada;
import ucla.axelia.modelo.dao.ServicioVoluntarioDAO;
import ucla.axelia.modelo.data.Voluntario;

public class ServicioAdministracionReporteVoluntariosPorPerfil implements
		IServicioAdministracionReporteVoluntariosPorPerfil {

	private ServicioVoluntarioDAO servicioVoluntarioDAO;
	
	@Override
	public List<Voluntario> obtenerVoluntarios(String sexo, EstadoCivil estadoCivil,
			String tienePasaporte, String clasificacion, String asegurado,
			String donante, GrupoSanguineo grupoSanguineo, Integer edadMinima,
			Integer edadMaxima) {
		List<Criterion> criterios = new ArrayList<Criterion>();
		if (sexo != null)
			criterios.add(Restrictions.eq("sexo", sexo));
		if (estadoCivil != null)
			criterios.add(Restrictions.eq("estadoCivilVoluntario", estadoCivil.getId()));
		if (tienePasaporte != null)
			criterios.add(tienePasaporte == RespuestaCerrada.SI
					? Restrictions.isNotNull("numeroPasaporte")
					: Restrictions.isNull("numeroPasaporte"));
		if (clasificacion != null)
			criterios.add(Restrictions.eq("clasificacion", clasificacion));
		if (asegurado != null)
			criterios.add(Restrictions.eq("asegurado", asegurado));
		if (donante != null)
			criterios.add(Restrictions.eq("donante", donante));
		if (grupoSanguineo != null)
			criterios.add(Restrictions.eq("grupoSanguineo", grupoSanguineo.getId()));
		if (edadMinima != null) {
			Calendar c = Calendar.getInstance();
			c.add(Calendar.YEAR, -1 * edadMinima);
			System.out.println(c.get(Calendar.YEAR) + " " + c.get(Calendar.MONTH) + " " + c.get(Calendar.DATE));
			criterios.add(Restrictions.le("fechaNacimiento", c.getTime()));
		}
		if (edadMaxima != null) {
			Calendar c = Calendar.getInstance();
			c.add(Calendar.YEAR, -1 * edadMaxima - 1);
			System.out.println(c.get(Calendar.YEAR) + " " + c.get(Calendar.MONTH) + " " + c.get(Calendar.DATE));
			criterios.add(Restrictions.gt("fechaNacimiento", c.getTime()));
		}
		List<Order> orden = new ArrayList<Order>();
		orden.add(Order.asc("codigoVoluntario"));
		return servicioVoluntarioDAO.buscarPorPropiedades(criterios, DataGenerica.DATA_ACTIVO, orden);
	}

	
	// Getters y Setters
	
	public ServicioVoluntarioDAO getServicioVoluntarioDAO() {
		return servicioVoluntarioDAO;
	}

	public void setServicioVoluntarioDAO(ServicioVoluntarioDAO servicioVoluntarioDAO) {
		this.servicioVoluntarioDAO = servicioVoluntarioDAO;
	}

}
